#ifndef SOLVERBASETYPES_HPP
#define SOLVERBASETYPES_HPP

#include <variant>

namespace hms
{

class Time;


class FunctionParserWrapper;


/* set to specific values, so that conditions can be written as "if (isUniform)"
 * which evaluate to true when isUniform == Uniformity::Uniform and false
 * otherwise. */
enum Uniformity {
	NonUniform = 0,
	Uniform = 1,
};

template<typename FieldType>
class FieldBase;

template<typename MeshType>
class Field;

template<Uniformity, typename MeshType>
class ConstantField;

template<Uniformity, typename MeshType>
class SourceField;

template<typename MeshType>
using ConstantFieldVar = std::variant<
	ConstantField<NonUniform, MeshType>,
	ConstantField<Uniform, MeshType>
>;

template<typename MeshType>
using SourceFieldVar = std::variant<
	SourceField<NonUniform, MeshType>,
	SourceField<Uniform, MeshType>
>;


template<typename MeshType>
class BoundaryCondition;


template<typename SolverType>
class SolverBase;

} // end namespace hms


#endif